void practiceexample1(){
	printf("有1、2、3、4个数字，能组成多少个互不相同且无重复数字的三位数？都是多少？\n");

	int i, j, k, n = 0;
	for (i = 1; i < 5; ++i) {
		for (j = 1; j < 5; ++j) {
			for (k = 1; k < 5; ++k) {
				if (i != j && i != k && j != k) {
					++n;
					printf("数字%d：%d%d%d\n", n, i, j, k);
				}
			}
		}
	}

	printf("一共有%d个数字\n", n);
}

void practiceexample2(){
	printf("企业发放的奖金根据利润提成\n");
	printf("利润(I)低于或等于10万元时，奖金可提10%；\n");
	printf("利润高于10万元，低于20万元时，低于10万元的部分按10%提成，高于10万元的部分，可提成7.5%\n");
	printf("20万到40万之间时，高于20万元的部分，可提成5%；\n");
	printf("40万到60万之间时高于40万元的部分，可提成3%；\n");
	printf("60万到100万之间时，高于60万元的部分，可提成1.5%；\n");
	printf("高于100万元时，超过100万元的部分按1%提成。\n");
	printf("从键盘输入当月利润I，求应发放奖金总数？\n");

	double i;
	double j = 0.0;

	printf( "输入当月利润 :");
	scanf("%lf", &i);

	if (i > 1000000) {
		j += (i - 1000000) * 0.01;
		i = 1000000;
	}
	if (i > 600000) {
		j += (i - 600000) * 0.015;
		i = 600000;
	}
	if (i > 400000) {
		j += (i - 400000) * 0.03;
		i = 400000;
	}
	if (i > 200000) {
		j += (i - 200000) * 0.05;
		i = 200000;
	}
	if (i > 100000) {
		j += (i - 100000) * 0.075;
		i = 100000;
	}
	if (i <= 100000) {
		j += i * 0.1;
	}
	printf("应发放奖金总数: %f\n", j);
}

void practiceexample3()
{
	printf("一个整数，它加上100后是一个完全平方数，再加上168又是一个完全平方数，请问该数是多少？\n");

	int i;
	double j, k;

	for (i=0;;++i) {
		j = sqrt((double)i+100);
		k = sqrt((double)i+100+168);

		// 判断是否是整数
		if (j == (int)j && k == (int)k) {
			printf("该数是:%d\n", i);
			break;
		}
	}
}

void practiceexample4(){
	printf("输入某年某月某日，判断这一天是这一年的第几天？\n");

	printf("请输入年月日（格式：1992.11.18）：");
	int y, m, d, sum;
	scanf("%d.%d.%d", &y, &m, &d);

	switch (m) {
		case 1:sum=0;break;
        case 2:sum=31;break;
        case 3:sum=59;break;
        case 4:sum=90;break;
        case 5:sum=120;break;
        case 6:sum=151;break;
        case 7:sum=181;break;
        case 8:sum=212;break;
        case 9:sum=243;break;
        case 10:sum=273;break;
        case 11:sum=304;break;
        case 12:sum=334;break;
        default:printf("data error");break;
	}

	// 判断闰年
	if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) {
		if (y > 2)
			sum += 1;
	}

	// 加上输入天数
	sum += d;

	printf("%d.%d.%d 是这一年的第%d天\n", y, m, d, sum);	
}

void practiceexample5()
{
	printf("输入三个整数x,y,z，请把这三个数由小到大输出\n");
	printf("输入三个整数(空格隔开):");

	int x, y, z, t;
	scanf("%d %d %d", &x, &y, &z);
	
	if (x > y) {
		t = x;
		x = y;
		y = t;
	}

	if (x > z) {
		t = x;
		x = z;
		z = t;
	}

	if (y > z) {
		t = y;
		y = z;
		z = t;
	}

	printf("三个整数由小到大输出:%d %d %d", x, y, z);
}

void practiceexample6()
{
	printf("用*号输出字母C的图案\n");

	printf("  ****\n");
	printf(" **   **\n");
	printf("**\n");
	printf("**\n");
	printf("**\n");
	printf(" **   **\n");
	printf("  ****\n");

}

void practiceexample7()
{
	printf("输出特殊图案，请在c环境中运行，看一看，Very Beautiful!\n");
	printf("字符共有256个。不同字符，图形不一样。\n");

	SetConsoleOutputCP(437);
	int a = 176, b = 219;
	printf("%c%c%c%c%c\n",b,a,a,a,b);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",a,a,b,a,a);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",b,a,a,a,b);
}

void practiceexample8()
{
	printf("输出9*9口诀。\n");

	int i, j;

	for (i = 1; i <= 9; ++i) {
		for (j = 1; j <= i; ++j) {
			printf("%d*%d=%d ", j, i, j * i);
		}
		printf("\n");
	}
}

void practiceexample9()
{
	printf("要求输出国际象棋棋盘。\n");

	SetConsoleOutputCP(437);
	int i, j;

	for (i = 1; i <= 8; ++i) {
		for (j = 1; j <= 8; ++j) {
			if (j % 2 == 0)
				printf("%c%c", 219, 219);
			else
				printf("  ");
		}
		printf("\n");
	}
}

void practiceexample10()
{
	printf("打印楼梯，同时在楼梯上方打印两个笑脸。\n");
	printf("用 ASCII 1 来输出笑脸；用i控制行，j来控制列，j根据i的变化来控制输出黑方格的个数\n");

	SetConsoleOutputCP(437);
	printf("%c%c", 1, 1);
	int i, j;

	for (i = 0; i < 9; ++i) {
		for (j = 0; j < i; ++j) {
			printf("%c%c", 219, 219);
		}
		printf("\n");
	}
}

void practiceexample11()
{
	printf("古典问题（兔子生崽）：有一对兔子，从出生后第3个月起每个月都生一对兔子，小兔子长到第三个月后每个月又生一对兔子，假如兔子都不死，问每个月的兔子总数为多少？（输出前40个月即可）\n");
	printf("兔子的规律为数列1,1,2,3,5,8,13,21....，即下个月是上两个月之和（从第三个月开始）\n");

	int a = 1, b = 1, c, i;

	printf("%d %d ", 1, 1);
	for (i = 3; i < 40; ++i) {
		c = a + b;
		printf("%d ", c);

		a = b;
		b = c;
	}
}

void practiceexample12()
{
	printf("判断101到200之间的素数。\n");
	printf("判断素数的方法：只能被1和这个数整除的数\n");

	int i, j, k;
	
	for (i = 101; i < 200; ++i) {
		k = 1;

		for (j = 2; j < i / 2; ++j) {
			if (i % j == 0) {
				k = 0;
				break;
			}
		}

		if (k)
			printf("%d是素数\n", i);
	}
}

void practiceexample13()
{
	printf("打印出所有的水仙花数(100-999)\n");
	printf("水仙花数：其各位数字立方和等于该数本身\n");

	int a, b, c, i;

	for (i = 100; i < 1000; ++i) {
		a = i % 10; // 个位数
		b = i / 10 % 10; // 十位数
		c = i / 100 % 10; // 百位数

		if (i == (pow((float)a, 3) + pow((float)b, 3) + pow((float)c, 3))) {
			printf("%d是水仙花数\n", i);
		}
	}

}

void practiceexample14()
{
	printf("将一个正整数分解质因数。\n");
	printf("例如：输入90,打印出90=2*3*3*5。\n");
	
	int a, i;
	printf("请输入一个正整数：");
	scanf("%d", &a);

	printf("%d=", a);

	while (a > 1) {
		for (i = 2; i <= a; ++i) {
			if (a % i == 0) {
				printf("%d", i);
				a /= i;
				if (a != 1) printf("*");
				break;
			}
		}
	}

}

void practiceexample15()
{
	printf("利用条件运算符的嵌套来完成此题：学习成绩>=90分的同学用A表示，60-89分之间的用B表示，60分以下的用C表示。\n");

	int a;
	char b;

	printf("输入分数：");
	scanf("%d", &a);

	b = a >= 90 ? 'A' : a >= 60 ? 'B' : 'C';

	printf("学习成绩：%c\n", b);
}

void practiceexample16()
{
	printf("输入两个正整数m和n，求其最大公约数和最小公倍数。\n");

	int m, n, a, b, c, d, e, i;

	printf("输入正整数m:");
	scanf("%d", &m);

	printf("输入正整数n:");
	scanf("%d", &n);

	if (m > n) {
		c = n;
		d = m;
	} else {
		c = m;
		d = n;
	}

	// 得到最大公约数 a
	for (i = c; i > 0; --i) {
		if (m % i == 0 && n % i == 0) {
			a = i;
			break;
		}
	}

	// 得到最小公倍数 a
	for (i = 1, e = d;;++i, e = d * i) {
		if (e % m == 0 && e % n == 0) {
			b = e;
			break;
		}
	}

	printf("正整数 %d 和 %d 的 最大公约数 是：%d\n", m, n, a);
	printf("正整数 %d 和 %d 的 最小公倍数 是：%d\n", m, n, b);
}

void practiceexample17()
{
	printf("输入一行字符，分别统计出其中英文字母、空格、数字和其它字符的个数。\n");
	printf("利用while语句\n");

	char e[100];
	int i, a, b, c, d;
	i = a = b = c = d = 0;
	printf("请输入一个字符串：");
	gets(e);

	while (e[i] != '\0') {
		if ((e[i] >= 'a' && e[i] <= 'z') || (e[i] >= 'A' && e[i] <= 'Z')) {
			++a;
		} else if (e[i] == ' ') {
			++b;
		} else if (e[i] >= '0' && e[i] <= '9') {
			++c;
		} else {
			++d;
		}

		++i;
	}

	printf("英文字母%d\n空格%d\n数字%d\n和其它字符%d\n", a, b, c, d);
}

void practiceexample18()
{
	printf("求s=a+aa+aaa+aaaa+aa...a的值，其中a是一个数字。\n");
	printf("例如2+22+222+2222+22222(此时共有5个数相加)，几个数相加有键盘控制。\n");
	printf("关键是计算出每一项的值。\n");

	int n, i;
	double a, b = 0.0;
	printf("请输入 a 和 n：");
	scanf("%f %d", &a, &n);

	for (i = 0; i < n; ++i) {
		b += a * pow(10.0, i);
	}

	printf("值是：%.0f\n", b);
}

void practiceexample19()
{
	printf("一个数如果恰好等于它的因子之和，这个数就称为完数。\n");
	printf("例如6=1＋2＋3.编程找出1000以内的所有完数。\n");
	
	int a, i, j;
	for (i = 1; i < 1000; ++i) {
		// 得到所有因数之和
		for (j = 1, a = 0; j < i; ++j) {
			if (i % j == 0) {
				a += j;
			}
		}

		if (a == i) {
			printf("完数：%d\n", i);
		}
	}
}

void practiceexample20()
{
	printf("一球从100米高度自由落下，每次落地后反跳回原高度的一半；\n");
	printf("再落下，求它在第10次落地时，共经过多少米？第10次反弹多高？\n");

	double a = 100, b = 0;
	for (int i = 0; i < 10; ++i) {
		b += a;
		a /= 2;
	}

	printf("共经过 %f 米;反弹 %f 米.\n", b, a);
}

void practiceexample21()
{
	printf("猴子吃桃问题：猴子第一天摘下若干个桃子，当即吃了一半，还不瘾，又多吃了一个\n");
	printf("第二天早上又将剩下的桃子吃掉一半，又多吃了一个。以后每天早上都吃了前一天剩下\n");
	printf("的一半零一个。到第10天早上想再吃时，见只剩下一个桃子了。求第一天共摘了多少。\n");

	int a = 1, i;
	for (i = 9; i > 0; --i) {
		a = (a + 1) * 2;
	}

	printf("第一天共摘了 %d\n", a);
}

void practiceexample22()
{
	printf("两个乒乓球队进行比赛，各出三人。甲队为a,b,c三人，乙队为x,y,z三人。\n");
	printf("已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比，c说他不和x,z比，\n");
	printf("请编程序找出三队赛手的名单。\n");

	// 思路： abc顺序不变，去枚举xyz的顺序 （xyz，xzy，yxz，yzx，zyx，zxy）六中情况
	char i, j, k; // a对应i b对应j c对应k
	
	for (i = 'x'; i <= 'z'; ++i) {
		for (j = 'x'; j <= 'z'; ++j) {
			if (i == j) continue;
			for (k = 'x'; k <= 'z'; ++k) {
				if (i == k || j == k) continue;
				if (i != 'x' && k != 'x' && k != 'z') {
					printf("a -- %c\nb -- %c\nc -- %c\n", i, j, k);
				}
			}
		}
	}
}

void practiceexample23()
{
	printf("打印出如下图案（菱形）。\n");

	int i, j, k;

	for (i = 1; i < 4; ++i) {
		k = 2 * i - 1;

		for (j = 4 - i; j > 0; --j) {
			printf(" ");
		}

		for (j = 1; j <= k; ++j) {
			printf("*");
		}

		printf("\n");
	}

	for (i = 4; i > 0; --i) {
		k = 2 * i - 1;

		for (j = 4 - i; j > 0; --j) {
			printf(" ");
		}

		for (j = 1; j <= k; ++j) {
			printf("*");
		}

		printf("\n");
	}
}

void practiceexample24()
{
	printf("有一分数序列：2/1，3/2，5/3，8/5，13/8，21/13...求出这个数列的前20项之和.\n");
	printf("规律：第一项分母 与 第二项分母 相加 等于 第三项分母，第一项分子 等于 第二项分母\n");

	double a, b, c, d, e, f = 0.0;
	int i, n = 20;

	a = 1.0; // 第一项分母
	b = 2.0; // 第一项分子 or 第二项分母
	c = 3.0; // 第二项分子

	printf("2/1\n3/2\n"); // 输出前两项
	f += b/a + c/b; //加上前两项的和
	for (i = 3; i < n; ++i) {
		d = b + c;
		e = a + b;
		printf("%.0f/%.0f\n", d, e); // 输出后面项
		f += d / e; //加上 后面项

		// 第一项变为第二项 第二项变为第三项 以此类推 
		a = b;
		b = c;
		c = e;
	}

	printf("这个数列的前%d项之和:%f\n", n, f);
}

void practiceexample25()
{
	printf("求1+2!+3!+...+20!的和\n");
	printf("例如：2!=1*2  3!=1*2*3 4!=1*2*3*4\n");

	int n = 20, i, j;
	long long sum = 0, a;

	for (i = 1; i <= n; ++i) {
		a = 1;
		for (j = 1; j <= i; ++j) {
			a *= j;
		}
		sum += a;
	}

	printf("和是：%llu\n", sum);
}

//利用递归方法求5!
long fact(int a)
{
	if (a == 1)
		return 1;
	return  a * fact(a - 1);
}
void practiceexample26()
{
	printf("利用递归方法求5!\n");

	printf("%lu\n", fact(5));
}
//利用递归方法求5!

//利用递归函数调用方式，将所输入的5个字符，以相反顺序打印出来。
void palin(int n)
{
	char next;

    if(n<=1) {
        next=getchar();
        printf("相反顺序输出结果\40:\40");
        putchar(next);
    } else {
        next=getchar();
        palin(n-1);
        putchar(next);
    }
}
void practiceexample27()
{
	int i=5;
    printf("请输入5个字符\40:\40");
    palin(i);
    printf("\n");
}
//利用递归函数调用方式，将所输入的5个字符，以相反顺序打印出来。

//利用递归的方法，递归分为回推和递推两个阶段。
int age(int n)
{
	if (n == 1) return 10;
	return age(n - 1) + 2;
}
void practiceexample28()
{
	printf("有5个人坐在一起，问第五个人多少岁？他说比第4个人大2岁。问第4个人岁数，他说比第3个人大2岁。\n");
	printf("问第三个人，又说比第2人大两岁。问第2个人，说比第一个人大两岁。最后问第一个人，\n");
	printf("他说是10岁。请问第五个人多大？\n");
	printf("利用递归的方法，递归分为回推和递推两个阶段。要想知道第五个人岁数，需知道第四人的岁数，\n");
	printf("依次类推，推到第一人（10岁），再往回推。。\n");
	printf("第五个人%d岁\n", age(5));
}
//要想知道第五个人岁数，需知道第四人的岁数，依次类推，推到第一人（10岁），再往回推。。

void practiceexample29()
{
	printf("给一个正整数，要求：一、求它是几位数，二、逆序打印出各位数字\n");
	printf("程序分析：学会分解出每一位数，如下解释。\n");

	long long a, b = 0;
	int i = 0, c;
	printf("请输入数字：");
	scanf("%llu", &a);

	while (a > 0) {
		c = a % 10;
		b = b * 10 + c;
		a /= 10;
		++i;
	}

	printf("逆序数字：%llu\n", b);
	printf("数字位数：%d\n", i);
}

void practiceexample30()
{
	printf("输入一个数字，判断它是不是回文数。即12321是回文数，个位与万位相同，十位与千位相同。\n");
	printf("程序分析：学会分解出每一位数。\n");

	long long a, b = 0, f;
	int i = 0, c, e;
	char *d[2] = {"是回文数", "不是回文数"};

	printf("请输入数字：");
	scanf("%llu", &a);
	f = a;

	while (a > 0) {
		c = a % 10;
		b = b * 10 + c;
		a /= 10;
		++i;
	}

	e = f == b ? 0 : 1;
	
	printf("逆序数字：%llu\n", b);
	printf("数字位数：%d\n", i);
	printf("数字 %llu %s\n", f, d[e]);
}

void practiceexample31()
{
	printf("请输入星期几的第一个字母来判断一下是星期几，如果第一个字母一样，则继续判断第二个字母。\n");
	printf("程序分析：用情况语句比较好，如果第一个字母一样，则判断用情况语句或if语句判断第二个字母。\n");
	printf("monday、tuesday、wednesday、thursday、friday、saturday 、sunday\n");

	char i, j, *k;
	printf("请输入第一个字母：");
	scanf("%c", &i);
	getchar();//scanf("%c",&j);的问题，第二次是读入的一个换行符，而不是输入的字符，因此需要加一个getchar() 吃掉换行符

	switch (i) {
		case 'm':
			k = "monday";
			break;
		case 't':
			printf("请输入第二个字母：");
			scanf("%c", &j);
			if (j == 'u') k = "tuesday";
			else if (j == 'h') k = "thursday";
			else {printf("输入错误!\n");exit(0);}
			break;
		case 'w':
			k = "wednesday";
			break;
		case 'f':
			k = "thursday";
			break;
		case 's':
			printf("请输入第二个字母：");
			scanf("%c", &j);
			if (j == 'a') k = "saturday";
			else if (j == 'u') k = "sunday";
			else {printf("输入错误!\n");exit(0);}
			break;
		default:
			printf("输入错误!\n");
			exit(0);
	}

	printf("这是%s\n", k);
}


// 删除字符串中指定字母函数
void deleteCharacters(char a[100], char b)
{
	int unsigned i, j;
	for (i = 0; a[i] != '\0'; ++i) {
		while (a[i] == b) {
			for (j = i; a[j] != '\0'; ++j) {
				a[j] = a[j + 1];
			}
			a[j] = '\0';
		}
	}
}
void practiceexample32()
{
	printf("删除一个字符串中的指定字母，如：字符串 aca，删除其中的 a 字母。\n");

	char a[100], b;

	printf("请输入一个字符串：");
	scanf("%s", a, 100);
	getchar();//scanf("%c",&j);的问题，第二次是读入的一个换行符，而不是输入的字符，因此需要加一个getchar() 吃掉换行符

	printf("请输入要删除的字符：");
	scanf("%c", &b);
	
	deleteCharacters(a, b); //删除字符串中指定字母函数
	
	printf("删除后的字符串：%s\n", a);
}

// 判断是否是素数 1 是素数 0 不是素数
int isPrimeNaive(int n)
{
	int i;
	for (i = 2;i < n / 2;++i) {
		if (n % i == 0) return 0;
	}

	return 1;
}
void practiceexample33()
{
	printf("题目：判断一个数字是否为质数。\n");
	printf("程序分析：质数（prime number）又称素数，有无限个。一个大于1的自然数，除了1和它本身外，不能被其他自然数整除。\n");

	int a;
	char * b[] = {"不是素数", "是素数"}; // 声明中文数组方法
	printf("请输入一个数字：");
	scanf("%d", &a);
	
	printf("数字 %d %s \n", a, b[isPrimeNaive(a)]);
}


void hello_world()
{
	printf("Hello, world!\n");
}

void practiceexample34()
{
	printf("题目：练习函数调用。\n");
	
	hello_world();
}

// 反转字符串
char *revstr(char *str)
{
    char    *start = str;
	int		len = strlen(str);
    char    *end = str + len - 1;
    char    ch;

    if (str != NULL)
    {
        while (start < end)
        {
            ch = *start;
            *start++ = *end;
            *end-- = ch;
        }
    }
    return str;
}
void practiceexample35()
{
	printf("题目：字符串反转，如将字符串 www.runoob.com 反转为 moc.boonur.www。\n");
	char a[10] = "abcde";
	printf("反转后的字符串：%s\n", revstr(a));
}

void practiceexample36()
{
	printf("题目：求100之内的素数。\n");
	printf("程序分析：质数（prime number）又称素数，有无限个。一个大于1的自然数，除了1和它本身外，不能被其他自然数整除。\n");
	
	printf("素数:\n");
	int i, j, k;
	for (i = 2; i < 100; ++i) {
		k = 1;
		for (j = 2; j < i / 2; ++j) {
			if (i % j == 0) {
				k = 0;
				break;
			}
		}

		if (k) printf("%d ", i);
	}
}

void practiceexample37()
{
	printf("题目：对10个数进行排序。\n");
	printf("程序分析：可以利用选择法，即从后9个比较过程中，选择一个最小的与第一个元素交换， 下次类推，即用第二个元素与后8个进行比较，并进行交换。\n");

	int a[10] = {5, 6, 7, 8, 2 , 4, 9, 3, 0, 1};
	int i, j = 0, t;

	// 选择排序
	for (i = 0; i < 10; ++i) {
		for (j = i + 1; j < 10; ++j) {

			if (a[i] > a[j]) {
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}

		}
	}

	for (j = 0; j < 10; ++j) {
		printf("%d\n", a[j]);
	}
}

void practiceexample38()
{
	printf("题目：求一个3*3矩阵对角线元素之和\n");
	printf("程序分析：利用双重for循环控制输入二维数组，再将a[i][i]累加后输出。\n");

	int i, j, a[3][3];

	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 3; ++j) {
			printf("请输入a[%d][%d]的值：", i, j);
			scanf("%d", &a[i][j]);
		}
	}

	printf("打印数组：\n");
	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 3; ++j) {
			printf("%3d", a[i][j]);
		}
		printf("\n");
	}

	printf("对角线元素之和:");
	for (i = 0, j = 0; i < 3; ++i) {
		j += a[i][i];
	}
	printf("%d\n", j);
}

void practiceexample39()
{
	printf("题目：有一个已经排好序的数组。现输入一个数，要求按原来的规律将它插入数组中。\n");
	printf("程序分析：首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。\n");

	int a[100] = {1};
	int b, i, j, t;
	int len = 1; // 数组长度 1

	printf("打印原始数组：\n");
	for (i = 0; i < len; ++i) {
		if (i % 5 == 0) printf("\n");
		printf("%d ", a[i]);
	}

	do {
		printf("\n请输入一个数：");
		scanf("%d", &b);

		if (a[len - 1] < b)
			a[len] = b;
		else 
		{
			for (i = 0; i < len; ++i) {
				if (a[i] > b) {
					t = i + 1;

					for (j = len; j > i; --j) {
						a[j] = a[j - 1];
					}
					a[j] = b;
					break;
				}
			}
		}
		
		printf("打印改变数组：\n");
		++len;
		for (i = 0; i < len; ++i) {
			if (i % 5 == 0) printf("\n");
			printf("%d ", a[i]);
		}
	} while (len < 100);
}

void practiceexample40()
{
	printf("题目：将一个数组逆序输出。");
	printf("程序分析：用第一个与最后一个交换。");

	int a[10]={0,1,2,3,4,5,6,7,8,9};
	int b, i;

	// 交换数组的值
	for (i = 0; i < 5; ++i) {
		b = a[i];
		a[i] = a[9 - i];
		a[9 - i] = b;
	}

	printf("打印数组：\n");
	for (i = 0; i < 10; ++i) {
		printf("a[%d] = %d\n", i, a[i]);
	}
}

void practiceexample41()
{
	printf("题目：学习static定义静态变量的用法。");

	for (int i = 0; i < 5; ++i) {
		int a = 0;
		int static b = 0;
		++b;

		printf("a = %d\n b = %d\n", a, b);
	}
}

void practiceexample42()
{
	printf("题目：学习使用auto定义变量的用法。\n");

	int i,num;
    num=2;
    for(i=0;i<3;i++)
    {
        printf("num 变量为 %d \n",num);
        num++;
        {
            auto int num=1;
            printf("内置模块 num 变量为 %d \n",num);
            num++;
        }
    }
}

void practiceexample43()
{
	printf("题目：学习使用static的另一用法。\n");
	
	int i,num;
    num=2;

    for(i=0;i<3;i++)
    {
        printf("num 变量为 %d \n",num);
        num++;

        {
            static int num=1;
            printf("内置模块 num 变量为 %d\n",num);
            num++;
        }

    }
}

// 题目：学习使用external的用法
int a,b,c;
void add()
{
	int a;
	a=3;
	c=a+b;
}
void practiceexample44()
{
	printf("题目：学习使用external的用法。\n");

	int a=b=4;
    add();
    printf("c 的值为 %d\n",c);
}
// 题目：学习使用external的用法

void practiceexample45()
{
	printf("题目：学习使用register定义变量的方法。\n");

	register int i;
    int tmp=0;

    for(i=1;i<=100;i++)
        tmp+=i;
    printf("总和为 %d\n",tmp);
}

void practiceexample46()
{
	printf("题目：宏#define命令练习。\n");

	#define TRUE 1
	#define FALSE 0
	#define SQ(x) (x)*(x)

	int num;
	int again=1;
	printf("如果值小于 50 程序将终止。\n");

	while(again)
	{
		printf("\n请输入数字：");
		scanf("%d",&num);
		printf("该数字的平方为 %d \n",SQ(num));

		if(num>=50)
			again=TRUE;
		else
			again=FALSE;
	}
}

void practiceexample47()
{
	printf("题目：宏#define命令练习2。\n");

	#define exchange(a,b) { int t;t=a;a=b;b=t;}//注意放在一行里

    int x=10;
    int y=20;

    printf("x=%d; y=%d\n",x,y);

    exchange(x,y);
    printf("x=%d; y=%d\n",x,y);
    
}

void practiceexample48()
{
	printf("题目：宏#define命令练习3。\n");
	
	#define LAG >
	#define SMA <
	#define EQ ==

	int a, b;

	while (1) 
	{
		printf("输入两个整数，用空格隔开：");
		scanf("%d %d", &a, &b);

		if (a LAG b)
			printf("%d > %d\n", a, b);
		
		if (a SMA b)
			printf("%d < %d\n", a, b);
		
		if (a EQ b)
			printf("%d == %d\n", a, b);
	}
}

void practiceexample49()
{
	printf("题目：#if #ifdef和#ifndef的综合应用。\n");

	#define TRUE 1
	#define FALSE 0
	
	int a;

	#ifdef TRUE
		a = TRUE;
		printf("TRUE 被定义\na = %d\n", a);
	#endif

	#ifdef FALSE
		a = FALSE;
		printf("FALSE 被定义\na = %d\n", a);
	#endif

	#ifndef ABC
		a = 3;
		printf("ABC 未被定义\na = %d\n", a);
	#endif
}

void practiceexample50()
{
	printf("题目：#include 的应用练习。\n省略。。。\n帮助网址https://www.runoob.com/cprogramming/c-exercise-example50.html\n");
}

void practiceexample51()
{
	printf("题目：学习使用按位与 &。\n");
	printf("说明：将数字转换成二进制数，都是1的变为1，例：101 011 按位或 001\n");
	
	int a, b;

	while (1) {
		printf("请输入两个数字，用空格隔开：");
		scanf("%d %d", &a, &b);

		printf("%d & %d : %d\n", a, b, a & b);
	}
}

void practiceexample52()
{
	printf("题目：学习使用按位或 |。\n");
	printf("程序分析：程序分析：0|0=0; 0|1=1; 1|0=1; 1|1=1\n");
	printf("说明：将数字转换成二进制数，只要是1的变为1，例：1 01 按位或 11 \n");

	int a, b;

	while (1) {
		printf("请输入两个数字，用空格隔开：");
		scanf("%d %d", &a, &b);

		printf("%d | %d : %d\n", a, b, a | b);
	}
}

void practiceexample53()
{
	printf("题目：学习使用按位异或 ^。\n");
	printf("程序分析：0^0=0; 0^1=1; 1^0=1; 1^1=0 。\n");
	printf("说明：将数字转换成二进制数，两个不一样的变为1，例：10 01 按位或 11 \n");

	int a, b;

	while (1) {
		printf("请输入两个数字，用空格隔开：");
		scanf("%d %d", &a, &b);

		printf("%d ^ %d : %d\n", a, b, a ^ b);
	}
}

void practiceexample54()
{
	printf("题目：取一个整数 a 从右端开始的 4～7 位。\n");

	unsigned a,b,c,d;

    printf("请输入整数：\n");
    scanf("%o", &a);

    b=a>>4;
    c=~(~0<<4);
    d=b&c;

    printf("%o\n%o\n%o\n%o\n",a,b,c,d);
}

void practiceexample55()
{
	printf("题目：学习使用按位取反~。\n");
	printf("程序分析：~0=1; ~1=0;\n");
	
	int a;
	while (1) {
		printf("请输入一个数字：");
		scanf("%d", &a);

		printf("~%d : %d\n", a, ~a);
	}
}

void practiceexample56()
{
	printf("查看Draw.c文件\n");	
}

void practiceexample57()
{
	printf("查看Draw.c文件\n");	
}

void practiceexample58()
{
	printf("查看Draw.c文件\n");	
}

void practiceexample59()
{
	printf("查看Draw.c文件\n");	
}

void practiceexample60()
{	
	printf("查看Draw.c文件\n");
}

void practiceexample61()
{
	printf("题目：打印出杨辉三角形（要求打印出10行）。\n");
	
	int a[10][10], i, j;
	a[0][0] = 1;
	a[1][0] = a[1][1] = 1;

	for (i = 2; i < 10; ++i) {
		a[i][0] = a[i][i] = 1;

		for (j = 1; j < i; ++j) {
			a[i][j] = a[i-1][j-1] + a[i-1][j];
		}
	}

	for (i = 0; i < 10; ++i) {
		for (j = 0; j <= i; ++j){
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
}

void practiceexample62()
{
	printf("查看Draw.c文件\n");
}

void practiceexample63()
{
	printf("查看Draw.c文件\n");
}

void practiceexample65()
{
	printf("查看Draw.c文件\n");
}

void swap(double *a, double *b)
{
	double c = *a;
	*a = *b;
	*b = c;
}
void practiceexample66()
{
	printf("题目：输入3个数a,b,c，按大小顺序输出。\n");
	printf("程序分析：利用指针方法。\n");

	double a, b, c;
	double *d, *e, *f;

	d = &a;
	e = &b;
	f = &c;

	printf("输入3个数(空格隔开):");
	scanf("%lf %lf %lf", &a, &b, &c);

	printf("输入的3个数分别是：%lf %lf %lf\n", a, b, c);
	printf("输入的3个数分别是：%lf %lf %lf\n", *d, *e, *f);

	printf("交换数值：\n");
	if (*d > *e)
		swap(d, e);

	if (*d > *f)
		swap(d, f);

	if (*e > *f)
		swap(e, f);
	
	printf("交换后的数值：%lf %lf %lf\n", a, b, c);
}

void practiceexample67()
{
	printf("题目：输入数组，最大的与第一个元素交换，最小的与最后一个元素交换，输出数组。\n");

	int a[20], i, n, min, max, tmp;
	min = max = 0;

	printf("请输入数组长度n(0<n<=20)：");
	scanf("%d", &n);
	getchar(); // 吃掉换行符

	// 输入数组元素 并 得到最小元素和最大元素的位置
	for (i = 0; i < n; ++i)
	{
		printf("请输入a[%d]的值：", i);
		scanf("%d", &a[i]);

		if (a[min] > a[i]) min = i;
		if (a[max] < a[i]) max = i;
	}

	printf("最小元素和最大元素的位置分别是：%d %d\n", min, max);

	// 最大的与第一个元素交换
	tmp = a[0];
	a[0] = a[max];
	a[max] = tmp;

	// 最小的与最后一个元素交换
	tmp = a[n-1];
	a[n-1] = a[min];
	a[min] = tmp;

	// 遍历数组
	outArrInt(a, n);
}

void practiceexample68()
{
	printf("题目：有 n个整数，使其前面各数顺序向后移 m 个位置，最后m个数变成最前面的 m 个数。\n");

	int a[20], b[20] = {0}, m, n, i;

	printf("请输入m, n(0 < n < 21, m < n):");
	scanf("%d %d", &m, &n); // 2 5
	getchar();

	printf("构建数组:\n");
	for (i = 0; i < n; ++i)
	{
		printf("请输入a[%d]:", i);
		scanf("%d", &a[i]);
	}

	printf("构建的数组为：\n");
	outArrInt(a, n);

	printf("移动元素：\n");
	printf("将 a 需要移动到前面的元素 保存 到 另一个数组b中\n");
	for (i = 0; i < m; ++i)
	{
		b[i] = a[m+i+1];
	}

	printf("将 a剩余元素 偏移 到 m位置\n");
	for (i = n - m - 1; i > -1; --i)
	{
		a[i + m] = a[i];
	}

	printf("将 b元素 还给 a元素\n");
	for (i = 0; i < m; ++i)
	{
		a[i] = b[i];
	}

	printf("移动完毕\n");
	printf("打印移动后的数组\n");
	outArrInt(a, n);
}

void practiceexample69()
{
	printf("题目：有n个人围成一圈，顺序排号。从第一个人开始报数（从1到m报数），凡报到m的人退出圈子，问最后留下的是原来第几号的那位。\n");

	int n, a[50] = {0}, i, j = 1, k, m; // 人数 容器 for循环 计数 for循环 目标数字

	printf("请输入m, n(0<n<50)：");
	scanf("%d %d", &m, &n);

	printf("构建数组：\n");
	for (i = 0; i < n; ++i)
	{
		*(a + i) = i + 1;
	}

	printf("构建的数组为：\n");
	outArrInt(a, n);

	while (n > 1)
	{
		for (i = 0; i < n; ++i,++j) 
		{
			if (j == m) 
			{
				printf("%d号退出\n", a[i]);
				for (k = i; k < n; ++k) 
				{
					a[k] = a[k+1];
				}
				j = 1;
				--n;
			}
		}
	}

	printf("最后剩下的人是：%d\n", a[0]);
}

void practiceexample70()
{
	printf("题目：写一个函数，求一个字符串的长度，在main函数中输入字符串，并输出其长度。\n");

	int len = 0, i = 0;
	char a[100];
	printf("请输入一个字符串:");
	scanf("%[^\n]", a);
	// gets(a);

	while (a[i++] != '\0') ++len;
	printf("字符串长度是:%d\n", len);
}

// 结构体
typedef struct
{
    char name[20];
    char sex[5];
    int age; 
} practiceexample71_Stu;
void input(practiceexample71_Stu * stu, int num)
{
	int i;
	for (i = 0; i < num; ++i)
		scanf("%s %s %d", &stu[i].name, &stu[i].sex, &stu[i].age);
}
void output(practiceexample71_Stu * stu, int num)
{
	int i;
	for (i = 0; i < num; ++i)
		printf("%s %s %d\n", stu[i].name, stu[i].sex, stu[i].age);
}
void practiceexample71()
{
	printf("题目：编写input()和output()函数输入，输出5个学生的数据记录。\n");
	practiceexample71_Stu stu[5];

    printf("请输入5个学生的信息：姓名 性别 年龄:\n");
	input(stu, 5);

	printf("输出5个学生的信息：姓名 性别 年龄:\n");
	output(stu, 5);
}
// 结构体

//链表
typedef struct practiceexample72Tag
{
	int num;
	struct practiceexample72Tag * last;
	struct practiceexample72Tag * next;
} practiceexample72List;
practiceexample72List * practiceexample72Create()
{
	printf("题目：创建一个链表。\n");
	
	practiceexample72List *head, *node, *end;
	int n = 10, i;

	head = (practiceexample72List*)malloc(sizeof(practiceexample72List));
	if (head == NULL)
	{
		printf("分配内存失败！！");
		exit(0);
	}

	end = head;
	end -> last = NULL;
	end -> num = n;

	for (i = n; i > 0; --i)
	{
		node = (practiceexample72List*)malloc(sizeof(practiceexample72List));
		node -> num = rand() % 101;
		node -> last = end;

		end -> next = node;
		end = node;
	}

	end -> next = NULL;
	return head;
}

void practiceexample73Rprint(practiceexample72List *hne)
{
	printf("题目：反向输出一个链表。");
	
	int i = 0;
	while (hne->last)
	{
		printf("%d:%d ", ++i, hne->num);
		hne = hne -> last;
	}
}

practiceexample72List * practiceexample74(practiceexample72List *start, practiceexample72List *end)
{
	printf("题目：连接两个链表。\n");
	practiceexample72List *head = start;
	// 找到头结点
	while (head -> last)
		head = head -> last;

	// 找到start的尾节点
	while (start -> next)
		start = start -> next;
	
	// 找到end的头结点
	while (end -> last)
		end = end -> last;
	
	start -> next = end;
	end -> last = start;

	return head;
}
//链表

void practiceexample75()
{
	printf("题目：输入一个整数，并将其反转后输出。\n");
	
	unsigned long long a, b = 0;
	int i, c;

	printf("请输入一个整数:");
	scanf("%llu", &a);

	printf("输入的数是：%llu\n", a);
	printf("将数字反转保存到b中:\n");

	while (a > 0)
	{
		c = a % 10;
		b = b * 10 + c;
		a /= 10;
	}

	printf("反转后的数字为：%llu\n", b);
}

// 函数指针
// 偶数
double evenumber(int n)
{
	double a = 0.0;
	int i;
	for (i = 2; i <= n; i += 2) 
		a += 1.0 / i;
	return a;
}
// 奇数
double oddnumber(int n)
{
	double a = 0.0;
	int i;
	for (i = 1; i <= n; i += 2) 
		a += 1.0 / i;
	return a;
}
void practiceexample76()
{
	printf("题目：编写一个函数，输入n为偶数时，调用函数求1/2+1/4+...+1/n,当输入n为奇数时，调用函数1/1+1/3+...+1/n(利用指针函数)。");

	int a;
	double (*pfunc)(int); // 函数指针

	printf("请输入一个整数：");
	scanf("%d", &a);

	printf("输入整数为：%d\n", a);
	pfunc = a % 2 == 0 ? evenumber : oddnumber;
	
	printf("%lf\n", (*pfunc)(a));
}
// 函数指针

void practiceexample77()
{
	printf("题目：填空练习（指向指针的指针）。\n");

	const char *s[]={"man","woman","girl","boy","sister"};
    const char **q;
    int k;
    for(k=0;k<5;k++)
    {
        q=&s[k];       /*在这里填入内容*/
        printf("%s\n",*q);
    }
}

void practiceexample78()
{
	printf("题目：找到年龄最大的人，并输出。\n");

	struct practiceexample78_man{
		char name[20];
		int  age;
	} 
	practiceexample78_person[3] = {"li",18,"wang",25,"sun",22}, *p, *q;

	int i, m;

	p = practiceexample78_person;
	m = p -> age;
	q = p; // 报错最大值索引
	
	for (i = 0; i < 3; ++i)
	{
		printf("姓名：%s 年龄：%d\n", p -> name, p -> age);
		if (m < p -> age) 
		{
			m = p -> age;
			q = p;
		}
		++p;
	}
	printf("最大年龄的人是：%s\n", q->name);
}

void practiceexample79_swap(char *a, char *b)
{
	char c[20];
	strcpy(c, a);
	strcpy(a, b);
	strcpy(b, c);
}
void practiceexample79()
{
	printf("题目：字符串排序。\n");

	char a[20], b[20], c[20];

	printf("请输入字符串a：");
	gets(a);

	printf("请输入字符串b：");
	gets(b);

	printf("请输入字符串c：");
	gets(c);

	if (strcmp(a, b) > 0)
		practiceexample79_swap(a, b);

	if (strcmp(a, c) > 0)
		practiceexample79_swap(a, c);
	
	if (strcmp(b, c) > 0)
		practiceexample79_swap(b, c);
	
	printf("%s < %s < %s\n", a, b, c);
}

void practiceexample80()
{
	printf("题目：海滩上有一堆桃子，五只猴子来分。第一只猴子把这堆桃子平均分为五份，多了一个，这只 猴子把多的一个扔入海中，拿走了一份。第二只猴子把剩下的桃子又平均分成五份，又多了 一个，它同样把多的一个扔入海中，拿走了一份，第三、第四、第五只猴子都是这样做的， 问海滩上原来最少有多少个桃子？\n");

	// 模拟猴子分桃子
	int i, j, k, l;
	for (i = 0;; ++i) {
		l = 0;
		k = i;

		for (j = 0; j < 5; ++j) {
			if (k % 5 == 1) {
				k = k / 5 * 4;
				++l;
			}
		}
		
		if (l == 5) break;
	}
	printf("\n海滩上原来最少有%d个桃子\n", i);
}

void practiceexample81()
{
	printf("题目：809*?? = 800*??+9*?? 其中??代表的两位数, 809*??为四位数，8*??的结果为两位数，9*??的结果为3位数。求??代表的两位数，及809*??后的结果。\n");

	int a, b, c, i;
	for (i = 10; i < 100; ++i) {
		a = 809 * i;
		b = 8 * i;
		c = 9 * i;
		if (a == b * 100 + c && a % 1000 > 0 && b % 10 > 0 && c % 100 > 0) 
			break;
	}

	printf("??代表的两位数，及809*??后的结果分别是：%d %d\n", i, a);
}

void practiceexample82()
{
	printf("题目：八进制转换为十进制\n");

	int a, b, c = 0, d = 0;

	printf("请输入一个八进制数：");
	scanf("%d", &a);

	while (a > 0)
	{
		b = a % 10;
		c += b * pow(8.0, d);
		a /= 10;
		++d;
	}

	printf("十进制数为：%d\n", c);
}

void practiceexample83()
{
	printf("题目：求0—7所能组成的奇数个数。\n");
	printf("这个问题其实是一个排列组合的问题，设这个数为 sun=a1a2a3a4a5a6a7a8,a1-a8\n");
	printf("表这个数的某位的数值，当一个数的最后一位为奇数时，那么这个数一定为奇数，不\n");
	printf("管前面几位是什么数字。如果最后一位数为偶数，则这个数一定为偶数。a1-a8可以\n");
	printf("取 0-7 这个八个数字，首位数字不为 0。从该数为一位数到该数为8位数开始统计\n");
	printf("奇数的个数：当只有一位数时也就是该数的最后一位，奇数个数为4,\n");
	printf("当该数为两位数时，奇数个数为4*7=28当该数为三位数时，奇数个数为：4*8*7=224\n");
	printf("...\n");
	printf("当该数为八位数时，奇数个数为：4*8*8*8*8*8*8*7(依次为最后一位到第一位)\n");
	
	int e = 4, s = 7, z = 8, a, b = 0, i;
	printf("1位数为奇数的个数%d\n", e);
	printf("2位数为奇数的个数%d\n", s * e);

	b = 32;
	for (i = 3; i < 9; ++i) {
		a = 7 * z * 4;
		b += a;
		printf("%d位数为奇数的个数%d\n", i, a);
		z *= 8;
	}
	printf("奇数的总个数为：%d\n", b);
}

void practiceexample84()
{
	printf("题目：一个偶数总能表示为两个素数之和。\n");
	printf("程序分析：我去，这是什么题目，要我证明这个问题吗？真不知道怎么证明。那就把一个偶数分解成两个素数吧。\n");

	int a, i;
	printf("请输入一个偶数：");
	scanf("%d", &a);
	
	for (i = a-1; i > 0; --i) {
		if (isPrime(i) && isPrime(a - i)) {
			printf("偶数%d可以分解成%d和%d两个素数的和\n",a,i,a-i);
			break;
		}
	}
}

void practiceexample85()
{
	printf("题目：判断一个素数能被几个9整除。\n");
	printf("程序分析：丫的！这题目的意思是判断一个素数能整除几个9组成的数吧？我就这么理解吧。素数是不 能被除1和自身之外的数整除的\n");

	int a;
	long int b = 9;

	a = 13;
	
	while (b % a != 0)
		b = b*10 + 9;
	
	printf("素数%d能被%d整除\n", a, b);
}

char * practiceexample86_strconnect(char *a, char *b)
{
	char *c;
	int a_len, b_len, c_len, i, n=0;

	a_len = strlen(a);
	b_len = strlen(b);
	c_len = a_len + b_len;

	c = (char*)malloc(sizeof(char) * (c_len + 1));

	for (i = 0; i < a_len; ++i, ++n)
		c[n] = *(a+i);

	for (i = 0; i < b_len; ++i, ++n)
		c[n] = *(b+i);
	
	c[n] = '\0';
	return c;
}
void practiceexample86()
{
	printf("题目：两个字符串连接程序 。\n");
	char a[20], b[20], *c;

	printf("请输入两个字符串，用空格隔开：");
	scanf("%s %s", a, b);
	c = practiceexample86_strconnect(a, b);
	printf("连接后的字符串为：");
	puts(c);
}

struct practiceexample87_student
{
    int x;
    char c;
} practiceexample87_a;
void practiceexample87_b(struct practiceexample87_student a)
{
	a.x = 1;
	a.c = 'a';
}
void practiceexample87()
{
	printf("题目：回答结果（结构体变量传递）。\n");
	struct practiceexample87_student a;
	a.x = 3;
	a.c = 'f';
	practiceexample87_b(a);
	printf("a.x=%d a.c=%c", a.x, a.c);
}

void practiceexample88()
{
	printf("题目：读取7个数（1—50）的整数值，每读取一个值，程序打印出该值个数的 *。\n");

	int i, j, a;
	for (i = 0; i < 7; ++i){
		printf("请输入一个1-50的数字：");
		scanf("%d", &a);
		getchar();
		if (a < 1 || a > 50){
			--i;
		} else {
			for (j = 0; j < a; ++j)
				printf("*");
			printf("\n");
		}
	}
		
	printf("\n");
}

void practiceexample89()
{
	printf("题目：某个公司采用公用电话传递数据，数据是四位的整数，在传递过程中是加密的，加密规则如下： 每位数字都加上5,然后用和除以10的余数代替该位数字，再将第一位和第四位交换，第二位和第三位交换。\n");
	printf("例：1456 => 6 9 10 11 => 6 9 0 1 => 6901 => 1096\n");

	int a, b, c = 0;
	printf("请输入一个四位整数：");
	scanf("%d", &a);

	b = a;
	while (b > 0) {
		c = c * 10 + (b % 10 + 5) % 10;
		b /= 10;
	}
	printf("%d 加密后的数字：%d", a, c);
}

void practiceexample90()
{
	printf("题目：专升本一题，读结果。反转一个整数数组\n");
	int a[5] = {1, 2, 3, 4, 5}, i = 0, j = 4, t;
	while (i < j)
	{
		t = *(a + i);
		*(a +i ) = *(a + j);
		*(a + j) = t;
		++i;
		--j;
	}

	for (i = 0; i < 5; ++i) {
		printf("%d\n", *(a+i));
	}
}

void practiceexample91()
{
	printf("题目：时间函数举例1\n");
	time_t rawtime;
    struct tm * timeinfo;
    
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    printf ( "当前本地时间为: %s", asctime (timeinfo) );
}

void practiceexample92()
{
	printf("题目：时间函数举例2\n");

	time_t start,end;
    int i;
    start=time(NULL);
    for(i=0;i<30000;i++)
    {
        printf("#");  // 返回两个time_t型变量之间的时间间隔
    }
    end=time(NULL);
    
    // 输出执行时间
    printf("时间间隔为 %6.3f\n",difftime(end,start));
}

void practiceexample93()
{
	printf("题目：时间函数举例2\n");
	long i=10000000L;
    clock_t start,finish;
    double TheTimes;
    printf("做%ld次空循环需要的时间为",i);
    start=clock();
    while(i--);
    finish=clock();
    TheTimes=(double)(finish-start)/CLOCKS_PER_SEC;
    printf("%f秒。\n",TheTimes);
}

void practiceexample94()
{
	printf("猜谜游戏：随机一个1-100的数字，用户猜测数字，并告诉用户大了还是小了\n");

	int a, b = 1;
	a = rand() % 100 + 1; // 1-100

	while (1)
	{
		printf("请输入一个1-100的数字(输入0退出)：");
		scanf("%d", &b);
		getchar();

		if (b == a) {
			puts("猜对了！！");
			b = 0;
		}

		if (!b) {
			printf("游戏结束\n");
			break;
		}
		
		if (b < a)
			puts("猜小了，请重试");
		else
			puts("猜大了，请重试");
	}
}

struct practiceexample95_programming
{
    float constant;
    char *pointer;
};
void practiceexample95()
{
	printf("题目：简单的结构体应用实例。\n");

	struct practiceexample95_programming variable;
    char string[] = "菜鸟教程：http://www.runoob.com";
    
    variable.constant = 1.23;
    variable.pointer = string;
    
    printf("%f\n", variable.constant);
    printf("%s\n", variable.pointer);
}

void practiceexample96()
{
	printf("题目：计算字符串中子串出现的次数 。\n");

	char a[50], b[10], c[10];
	int i, j, len1, len2, n = 0;

	printf("请输入字符串及其子串，用空格隔开：");
	scanf("%s %s", a, b);

	len1 = strlen(a);
	len2 = strlen(b);

	if (len2 <= len1) 
	{
		for (i = 0; i < len1; ++i)
		{
			if (a[i+len2-1] != '\0')
			{
				for (j = 0; j < len2; ++j)
					c[j] = a[i+j];
				c[len2] = '\0';
			}
			else
				break;
			
			if (!strcmp(b, c))
				++n;
		}
	}
	
	printf("字符串 %s 中出现 子串 %s 次数：%d", a, b, n);
}

void practiceexample97()
{
	printf("题目：从键盘输入一些字符，逐个把它们送到磁盘上去，直到输入一个#为止。\n");

	FILE *fp = NULL;
	char filename[25];
	char ch;

	printf("请输入文件名字：");
	gets(filename);

	if ((fp = fopen(filename, "w")) == NULL)
	{
		printf("打开文件失败！\n");
		exit(0);
	}

	printf("请输入任意字符，以#号结尾：\n");
	while ((ch = getchar()) != '#')
		fputc(ch, fp);

	fclose(fp);
	printf("写入文件完成\n");
}

void practiceexample98()
{
	printf("题目：从键盘输入一个字符串，将小写字母全部转换成大写字母，然后输出到一个磁盘文件a.txt中保存。 输入的字符串以！结束。\n");

	FILE *fp;
	char ch;

	if ((fp = fopen("a.txt", "w")) == NULL)
	{
		printf("打开文件失败！！\n");
		exit(0);
	}

	printf("请输入一个字符，以!结束：\n");
	while((ch = getchar()) != '!')
	{
		if (ch > 96 && ch < 123)
			ch -= 32;
		fputc(ch, fp);
	}
	
	fclose(fp);
}

void practiceexample99()
{
	printf("题目：有两个磁盘文件a和b,各存放一行字母，要求把这两个文件中的信息合并（按字母顺序排列），输出到一个新文件c中。\n");
	printf("a.txt文件内容：123。\n");
	printf("b.txt文件内容：456。\n");

	FILE *fa, *fb, *fc;
	fa = fb = fc = NULL;
	char ch;
	char a[20], b[20];

	// 创建a文件并写入内容
	if ((fa = fopen("a.txt", "w")) == NULL)
	{
		puts("创建a文件失败！！");
		exit(0);
	}
	fputs("123", fa);
	fclose(fa);

	// 创建b文件并写入内容
	if ((fb = fopen("b.txt", "w")) == NULL)
	{
		puts("创建a文件失败！！");
		exit(0);
	}
	fputs("456", fb);
	fclose(fb);

	// 创建c文件并写入内容
	if ((fc = fopen("c.txt", "w")) == NULL)
	{
		puts("创建a文件失败！！");
		exit(0);
	}

	// 以只读方式打开a文件	
	if ((fa = fopen("a.txt", "r")) == NULL)
	{
		puts("打开a文件失败！！");
		exit(0);
	}
	fgets(a, 19, fa);
	printf("a：%s\n", a);
	fclose(fa);

	// 以只读方式打开b文件
	if ((fb = fopen("b.txt", "r")) == NULL)
	{
		puts("打开b文件失败！！");
		exit(0);
	}
	fgets(b, 19, fb);
	printf("b：%s\n", b);
	fclose(fb);

	fputs(a, fc);
	fputs(b, fc);
	fclose(fc);
}

struct practiceexample100_student
{
	int id;
	char name[200]; // 名字
	int chinese; // 语文
	int math; // 数学
	int english; // 英语
	int avg; // 平均数
};
void practiceexample100()
{
	printf("题目：有五个学生，每个学生有3门课的成绩，从键盘输入以上数据（包括学生号，姓名，三门课成绩），计算出平均成绩，况原有的数据和计算出的平均分数存放在磁盘文件a.txt中。\n");

	FILE *fp;
	int i;
	struct practiceexample100_student students[5];
	char name[20];

	// 百度 scanf 怎么接受中文字符串
	for (i = 0; i < 3; ++i)
	{
		printf("请输入第%d个同学的名字，语文，数学，英语成绩，用空格隔开：\n", i + 1);
		students[i].id = i + 1;

		scanf("%s %d %d %d", students[i].name, &students[i].chinese, &students[i].math, &students[i].english);
		students[i].avg = (students[i].chinese + students[i].math + students[i].english) / 3;
		// strcpy(students[i].name, "刚刚");
		// getchar();
	}

	if ((fp = fopen("a.txt", "w")) == NULL)
	{
		printf("打开文件失败！！\n");
		exit(0);
	}

	fputs("ID 名字 语文 数学 英语 平均分\n", fp);
	for (i = 0; i < 3; ++i)
	{
		printf("接收数据：%d %s %d %d %d %d\n", students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].avg);
		
		fprintf(fp, "%d %s %d %d %d %d\n", students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].avg);
	}

	fclose(fp);
}

//命令行：cd "d:\VS Code\C\test\" && gcc Main.c -o Main && "d:\VS Code\C\test\"Main
// C 练习实例
void PracticeExample()
{
	// practiceexample1();
	// practiceexample2();
	// practiceexample3();
	// practiceexample4();
	// practiceexample5();
	// practiceexample6();
	// practiceexample7();
	// practiceexample8();
	// practiceexample9();
	// practiceexample10();
	// practiceexample11();
	// practiceexample12();
	// practiceexample13();
	// practiceexample14();
	// practiceexample15();
	// practiceexample16();
	// practiceexample17();
	// practiceexample18();
	// practiceexample19();
	// practiceexample20();
	// practiceexample21();
	// practiceexample22();
	// practiceexample23();
	// practiceexample24();
	// practiceexample25();
	// practiceexample26();
	// practiceexample27();
	// practiceexample28();
	// practiceexample29();
	// practiceexample30();
	// practiceexample31();
	// practiceexample32();
	// practiceexample33();
	// practiceexample34();
	// practiceexample35();
	// practiceexample36();
	// practiceexample37();
	// practiceexample38();
	// practiceexample39();
	// practiceexample40();
	// practiceexample41();
	// practiceexample42();
	// practiceexample43();
	// practiceexample44();
	// practiceexample45();
	// practiceexample46();
	// practiceexample47();
	// practiceexample48();
	// practiceexample49();
	// practiceexample50();
	// practiceexample51();
	// practiceexample52();
	// practiceexample53();
	// practiceexample54();
	// practiceexample55();
	// practiceexample56();
	// practiceexample57();
	// practiceexample58();
	// practiceexample59();
	// practiceexample60();
	// practiceexample61();
	// practiceexample62();
	// practiceexample63();
	// practiceexample64();
	// practiceexample65();
	// practiceexample66();
	// practiceexample67();
	// practiceexample68();
	// practiceexample69();
	// practiceexample70();
	// practiceexample71();
	// practiceexample72(); // 链表 不能单独调用
	// practiceexample73(); // 链表 不能单独调用
	// practiceexample74(); // 链表 不能单独调用
	// practiceexample75();
	// practiceexample76();
	// practiceexample77();
	// practiceexample78();
	// practiceexample79();
	// practiceexample80();
	// practiceexample81();
	// practiceexample82();
	// practiceexample83();
	// practiceexample84();
	// practiceexample85();
	// practiceexample86();
	// practiceexample87();
	// practiceexample88();
	// practiceexample89();
	// practiceexample90();
	// practiceexample91();
	// practiceexample92();
	// practiceexample93();
	// practiceexample94();
	// practiceexample95();
	// practiceexample96();
	// practiceexample97();
	// practiceexample98();
	// practiceexample99();
	practiceexample100();
}